#pragma once

//五子棋，玩法逻辑


#define GOBANG_STATE_BLACK_STEP 1
#define GOBANG_STATE_WHITE_STEP 2
#define GOBANG_STATE_BLACK_WIN  0x11
#define GOBANG_STATE_WHITE_WIN  0x12

#define GOBANG_ERROR_OUT_BOARD -2
#define GOBANG_ERROR_ALREADY_PIECE  -3
#define GOBANG_ERROR_ALREADY_WIN  -4

typedef struct gobang_state gobang_state;

gobang_state* gobang_init();

void gobang_destroy(gobang_state* s);

int gobang_reset(gobang_state* s);

int gobang_get_state(gobang_state* s);

int gobang_put_piece(gobang_state* s, int x, int y);

typedef void (*gobang_enum_pieces_callback)(void* udata, int x, int y, int iswhite);

int gobang_enum_pieces(gobang_state* s, gobang_enum_pieces_callback cb, void* udata);

int gobang_has_piece(gobang_state* s, int x, int y);

int gobang_get_last_piece(gobang_state* s, int* x, int* y);

//悔棋
int gobang_undo(gobang_state* s);

